Contravariant Functor
概要
contramapは、変換を表すデータ型に対してのみ意味がある
Functorが変換をF[A]の後に繋げていくのに対し、F[A]に来るまでに(ゴールはF[A]に決まっている)変換を繋げる contramap that represents “prepending” an operation to a chain
https://gyazo.com/3411147c43a0ad113a2792b07a251789
直感)Aを変換するような作用のFがあったとして、B=>Aがある場合はF[B]だとしてもF[A]に到着できるよね
showがContravariantになる理由
Show[Hoge]インスタンスがあるとして、Fuga=>Hogeな変換があるとしたら、Show[Fuga]でもshow(変換)できるよね
条件
contramap
contramap[A, B](fa: F[A])(f: B => A): F[B]
例
Function1
Show
cats.kernel.Order
Scala
code:scala
trait Contravariant[F_] extends InvariantF { self => def contramapA, B(fa: FA)(f: B => A): FB override def imapA, B(fa: FA)(f: A => B)(fi: B => A): FB = contramap(fa)(fi) }
code:scala
case class Money(amount: Int)
case class Salary(size: Money)
implicit val showMoney: ShowMoney = Show.show(m => s"$$${m.amount}") implicit val showSalary: ShowSalary = showMoney.contramap(_.size) code:scala
def show(value: A): String
def contramapB(func: B => A): ShowB = def show(value: B): String =
self.show(func(value))
}
}